<?php

namespace Mogod\Core\Model\Scheme\Worker;

require_once __DIR__ . '/ModelSchemeWorkerAbstract.php';

/**
 * Стандартный обработчик схемы моделей
 *
 * @author morph, goorus
 */
class ModelSchemeWorkerStandart extends ModelSchemeWorkerAbstract
{
	/**
	 * Репозитарий загруженных схем моделей
	 *
	 * @var Mogod\Core\Model\Scheme\Repository\ModelSchemeRepositoryAbstract
	 */
	protected $repository;

	/**
	 * Парсер нотаций файлов модели
	 *
	 * @var type Mogod\Core\Scheme\Parser\ModelSchemeParserAbstract
	 */
	protected $parser;

	/**
	 * @inheritdoc
	 */
	public function getFieldProperty($model, $fieldName, $propertyName)
	{
		$modelName = $model->getClass();
		$value = $this->repository->getFieldProperty(
			$modelName, $fieldName, $propertyName
		);
		if (!$value) {
			$field = $this->parser->parseField($model, $fieldName);
			$this->repository->appendField($modelName, $fieldName, $field);
			$value = $this->repository->getFieldProperty(
				$modelName, $fieldName, $propertyName
			);
		}
		return $value;
	}

	/**
	 * @inheritdoc
	 */
	public function getModelProperty($model, $properyName)
	{
		$modelName = $model->getClass();
		$value = $this->repository->getModelProperty($modelName, $properyName);
		if (!$value) {
			$scheme = $this->parser->parseModel($model);
			$this->repository->setModelScheme($modelName, $scheme);
			$value = $this->repository->getModelProperty($modelName, $properyName);
		}
		return $value;
	}

	/**
	 * Возвращает репозиторий схемы моделей
	 *
	 * @return Mogod\Core\Model\Scheme\Repository\ModelSchemeRepositoryAbstract
	 */
	public function getRepository()
	{
		return $this->repository;
	}

	/**
	 * Возвращает парсер схемы моделей
	 *
	 * @return Mogod\Core\Model\Scheme\Parser\ModelSchemeParserAbstract
	 */
	public function getParser()
	{
		return $this->parser;
	}

	/**
	 * Изменяет репозиторий схемы моделей
	 *
	 * @param Mogod\Core\Model\Scheme\Repository\ModelSchemeRepositoryAbstract $repository
	 */
	public function setRepository($repository)
	{
		$this->repository = $repository;
	}

	/**
	 * Изменяет парсер схемы моделей
	 *
	 * @param Mogod\Core\Model\Scheme\Parser\ModelSchemeParserAbstract $parser
	 */
	public function setParser($parser)
	{
		$this->parser = $parser;
	}
}